home *** CD-ROM | disk | FTP | other *** search
/ PC World Komputer 2010 April / PCWorld0410.iso / pluginy Firefox / 12581 / 12581.xpi / modules / preferences.jsm next >
Text File  |  2009-08-10  |  6KB  |  250 lines

  1. /* ***** BEGIN LICENSE BLOCK *****
  2.  * Version: MPL 1.1/GPL 2.0/LGPL 2.1
  3.  *
  4.  * The contents of this file are subject to the Mozilla Public License Version
  5.  * 1.1 (the "License"); you may not use this file except in compliance with
  6.  * the License. You may obtain a copy of the License at
  7.  * http://www.mozilla.org/MPL/
  8.  *
  9.  * Software distributed under the License is distributed on an "AS IS" basis,
  10.  * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
  11.  * for the specific language governing rights and limitations under the
  12.  * License.
  13.  *
  14.  * The Original Code is DownThemAll Preferences module.
  15.  *
  16.  * The Initial Developer of the Original Code is Nils Maier
  17.  * Portions created by the Initial Developer are Copyright (C) 2008
  18.  * the Initial Developer. All Rights Reserved.
  19.  *
  20.  * Contributor(s):
  21.  *   Nils Maier <MaierMan@web.de>
  22.  *
  23.  * Alternatively, the contents of this file may be used under the terms of
  24.  * either the GNU General Public License Version 2 or later (the "GPL"), or
  25.  * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
  26.  * in which case the provisions of the GPL or the LGPL are applicable instead
  27.  * of those above. If you wish to allow use of your version of this file only
  28.  * under the terms of either the GPL or the LGPL, and not to allow others to
  29.  * use your version of this file under the terms of the MPL, indicate your
  30.  * decision by deleting the provisions above and replace them with the notice
  31.  * and other provisions required by the GPL or the LGPL. If you do not delete
  32.  * the provisions above, a recipient may use your version of this file under
  33.  * the terms of any one of the MPL, the GPL or the LGPL.
  34.  *
  35.  * ***** END LICENSE BLOCK ***** */
  36.  
  37. const EXPORTED_SYMBOLS = [
  38.     'get',
  39.     'getExt',
  40.     'set',
  41.     'setExt',
  42.     'hasUserValue',
  43.     'hasUserValueExt',
  44.     'getChildren',
  45.     'getChildrenExt',
  46.     'reset',
  47.     'resetExt',
  48.     'resetBranch',
  49.     'resetBranchExt',
  50.     'resetAllExt',
  51.     'addObserver',
  52.     'removeObserver'
  53. ];
  54.  
  55. const EXT = 'extensions.mintrayr.';
  56.  
  57. const Cc = Components.classes;
  58. const Ci = Components.interfaces;
  59. const nsIPrefBranch = Ci.nsIPrefBranch;
  60. const nsIPrefBranch2 = Ci.nsIPrefBranch2;
  61.  
  62. const PREF_STRING = nsIPrefBranch.PREF_STRING;
  63. const PREF_INT = nsIPrefBranch.PREF_INT;
  64. const PREF_BOOL = nsIPrefBranch.PREF_BOOL;
  65.  
  66. const SupportsString = Components.Constructor('@mozilla.org/supports-string;1', 'nsISupportsString');
  67.  
  68. const prefs = Cc['@mozilla.org/preferences-service;1'].getService(Ci.nsIPrefBranch);
  69.  
  70. function get(key, defaultValue){
  71.     try {
  72.         let rv;
  73.         switch (prefs.getPrefType(key)) {
  74.             case PREF_INT:
  75.                 rv = prefs.getIntPref(key);
  76.                 break;
  77.             case PREF_BOOL:
  78.                 rv = prefs.getBoolPref(key);
  79.                 break;
  80.             default:
  81.                 rv = getMultiByte(key);
  82.                 break;
  83.         }
  84.         if (rv != undefined) {
  85.             return rv;
  86.         }
  87.     } 
  88.     catch (ex) {
  89.         // no-op
  90.     }
  91.     
  92.     return defaultValue;
  93. }
  94.     
  95. function getExt(key, defaultValue) {
  96.         return get(EXT + key, defaultValue);
  97. }
  98.  
  99. function set(key, value){
  100.     if (typeof value == 'number' || value instanceof Number) {
  101.         return prefs.setIntPref(key, value);
  102.     }
  103.     if (typeof value == 'boolean' || value instanceof Boolean) {
  104.         return prefs.setBoolPref(key, value);
  105.     }
  106.     return setMultiByte(key, value);
  107. }
  108.  
  109. function setExt(key, value){
  110.     return set(EXT + key, value);
  111. }
  112.  
  113. function getMultiByte(key, defaultValue){
  114.     try {
  115.         return prefs.getComplexValue(key, Ci.nsISupportsString).data;
  116.     } 
  117.     catch (ex) {
  118.         // no-op
  119.     }
  120.     return defaultValue;
  121. }
  122.  
  123. function setMultiByte(key, value) {
  124.     let str = new SupportsString();
  125.     str.data = value.toString();
  126.     prefs.setComplexValue(key, Ci.nsISupportsString, str);
  127. }
  128.  
  129. function hasUserValue(key) {
  130.     try {
  131.         return prefs.prefHasUserValue(key);
  132.     }
  133.     catch (ex) {
  134.         // no-op
  135.     }
  136.     return false;
  137. }
  138.  
  139. function hasUserValueExt(key) {
  140.     return hasUserValue(EXT + key);
  141. }
  142.  
  143. function getChildren(key) {
  144.     return prefs.getChildList(key, {});
  145. }
  146.  
  147. function getChildrenExt(key) {
  148.     return getChildren(EXT + key);
  149. }
  150.  
  151. function reset(key) {
  152.     try {
  153.         return prefs.clearUserPref(key);
  154.     }
  155.     catch (ex) {
  156.         // no-op
  157.     }
  158.     return false;
  159. }
  160.  
  161.  
  162. function resetExt(key) {
  163.     if (key.search(new RegExp('/^' + EXT + '/')) != 0) {
  164.         key = EXT + key;
  165.     }
  166.     return reset(key);
  167. }
  168.  
  169. function resetBranch(branch) {
  170.     try {
  171.         prefs.resetBranch(branch);
  172.     }
  173.     catch (ex) {
  174.         // BEWARE: not yet implemented in XPCOM 1.8/trunk.
  175.         let children = prefs.getChildList(branch, {});
  176.         for each (let key in children) {
  177.             reset(key);
  178.         }
  179.     }
  180. }
  181.  
  182. function resetBranchExt(branch) {
  183.     resetBranch('extension.dta.' + branch);
  184. }
  185.  
  186. function resetAllExt() {
  187.     resetBranchExt('');
  188. }
  189.  
  190. function addObserver(branch, obj) {
  191.     makeObserver(obj);
  192.     prefs.QueryInterface(nsIPrefBranch2).addObserver(branch, obj, true);
  193. }
  194.  
  195. function removeObserver(branch, obj) {
  196.     prefs.QueryInterface(nsIPrefBranch2).removeObserver(branch, obj);
  197. }
  198.  
  199. /**
  200.  * Tiny helper to "convert" given object into a weak observer. Object must still
  201.  * implement .observe()
  202.  * 
  203.  * @author Nils
  204.  * @param obj
  205.  *          Object to convert
  206.  */
  207. function makeObserver(obj) {
  208.     try {
  209.         if (
  210.             obj.QueryInterface(Ci.nsISupportsWeakReference)
  211.             && obj.QueryInterface(Ci.nsIObserver)
  212.         ) {
  213.             return;
  214.         }
  215.     }
  216.     catch (ex) {
  217.         // fall-through
  218.     }
  219.     let __QueryInterface = obj.QueryInterface;
  220.     obj.QueryInterface = function(iid) {
  221.         try {
  222.             if (
  223.                 iid.equals(Ci.nsISupports)
  224.                 || iid.equals(Ci.nsISupportsWeakReference)
  225.                 || iid.equals(Ci.nsIWeakReference)
  226.                 || iid.equals(Ci.nsIObserver)
  227.             ) {
  228.                 return obj;
  229.             }
  230.             if (__QueryInterface) {
  231.                 debug("calling original: " + iid);
  232.                 return __QueryInterface.call(this, iid);
  233.             }
  234.             throw Components.results.NS_ERROR_NO_INTERFACE;
  235.         }
  236.         catch (ex) {
  237.             debug("requested interface not available: " + iid);
  238.             throw ex;
  239.         }
  240.     };
  241.     // nsiWeakReference
  242.     obj.QueryReferent = function(iid) {
  243.         return obj.QueryInterface(iid);
  244.     };
  245.     // nsiSupportsWeakReference
  246.     obj.GetWeakReference = function() {
  247.         return obj;
  248.     };    
  249. }
  250.